package com.cennavi.minenavidemo.widget;
import android.content.Context;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.style.ForegroundColorSpan;
import android.text.style.RelativeSizeSpan;
import android.text.style.StyleSpan;
import android.util.AttributeSet;

import androidx.appcompat.widget.AppCompatTextView;

import java.util.ArrayList;
import java.util.List;

/**
 * 特殊字符变色的TextView富文本
 */
public class ColorTextView extends AppCompatTextView {

    public ColorTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    /**
     * 特殊文字变色
     *
     * @param text  全部文字
     * @param texts 需要特殊显示的字符串数组
     * @param color 特殊显示文字颜色
     */
    public void setSpecifiedTextsColor(String text, String[] texts, int color) {
        SpannableStringBuilder styledText;
        List<List<Integer>> sTextsStartLists = null;

        for (String specifiedTexts : texts) {
            if (specifiedTexts == null || specifiedTexts.equals("")) {
                continue;
            }

            if (sTextsStartLists == null){
                sTextsStartLists = new ArrayList<>();
            }

            List<Integer> sTextsStartList = new ArrayList<>();//最后一个字符记录长度
            int sTextLength = specifiedTexts.length();
            String temp = text;
            int lengthFront = 0;//记录被找出后前面的字段的长度
            int start;

            do {
                start = temp.indexOf(specifiedTexts);

                if (start != -1) {
                    start = start + lengthFront;
                    sTextsStartList.add(start);
                    lengthFront = start + sTextLength;
                    temp = text.substring(lengthFront);
                }

            } while (start != -1);

            sTextsStartList.add(sTextLength);
            sTextsStartLists.add(sTextsStartList);
        }

        styledText = new SpannableStringBuilder(text);

        if (sTextsStartLists == null){
            return;
        }

        for(List<Integer> sTextsStartList:sTextsStartLists){

            int sTextLength = sTextsStartList.get(sTextsStartList.size()-1);
            for (int index = 0 ; index< sTextsStartList.size()-1;index++) {
                Integer i = sTextsStartList.get(index);
                styledText.setSpan(
                        new ForegroundColorSpan(color),
                        i,
                        i + sTextLength,
                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
        }

        if (styledText != null) {
            setText(styledText);

        }
    }

    /**
     * 特殊文字变色
     *
     * @param text  全部文字
     * @param texts 需要特殊显示的字符串数组
     * @param style 特殊显示文字式样
     */
    public void setSpecifiedTextsStyleSpan(String text, String[] texts, int style) {
        SpannableStringBuilder styledText;
        List<List<Integer>> sTextsStartLists = null;

        for (String specifiedTexts : texts) {
            if (specifiedTexts == null || specifiedTexts.equals("")) {
                continue;
            }

            if (sTextsStartLists == null){
                sTextsStartLists = new ArrayList<>();
            }

            List<Integer> sTextsStartList = new ArrayList<>();//最后一个字符记录长度
            int sTextLength = specifiedTexts.length();
            String temp = text;
            int lengthFront = 0;//记录被找出后前面的字段的长度
            int start;

            do {
                start = temp.indexOf(specifiedTexts);

                if (start != -1) {
                    start = start + lengthFront;
                    sTextsStartList.add(start);
                    lengthFront = start + sTextLength;
                    temp = text.substring(lengthFront);
                }

            } while (start != -1);

            sTextsStartList.add(sTextLength);
            sTextsStartLists.add(sTextsStartList);
        }

        styledText = new SpannableStringBuilder(text);

        if (sTextsStartLists == null){
            return;
        }

        for(List<Integer> sTextsStartList:sTextsStartLists){

            int sTextLength = sTextsStartList.get(sTextsStartList.size()-1);
            for (int index = 0 ; index< sTextsStartList.size()-1;index++) {
                Integer i = sTextsStartList.get(index);
                styledText.setSpan(
                        new StyleSpan(style),
                        i,
                        i + sTextLength,
                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

            }
        }

        setText(styledText);
    }

    /**
     * 特殊字体
     *
     * @param text  全部文字
     * @param texts 需要特殊显示的字符串数组
     * @param size 特殊显示文字字体
     */
    public void setSpecifiedTextsSize(String text, String[] texts, float size) {
        SpannableStringBuilder styledText;
        List<List<Integer>> sTextsStartLists = null;

        for (String specifiedTexts : texts) {
            if (specifiedTexts == null || specifiedTexts.equals("")) {
                continue;
            }

            if (sTextsStartLists == null){
                sTextsStartLists = new ArrayList<>();
            }

            List<Integer> sTextsStartList = new ArrayList<>();//最后一个字符记录长度
            int sTextLength = specifiedTexts.length();
            String temp = text;
            int lengthFront = 0;//记录被找出后前面的字段的长度
            int start;

            do {
                start = temp.indexOf(specifiedTexts);

                if (start != -1) {
                    start = start + lengthFront;
                    sTextsStartList.add(start);
                    lengthFront = start + sTextLength;
                    temp = text.substring(lengthFront);
                }

            } while (start != -1);

            sTextsStartList.add(sTextLength);
            sTextsStartLists.add(sTextsStartList);
        }

        styledText = new SpannableStringBuilder(text);

        if (sTextsStartLists == null){
            return;
        }

        for(List<Integer> sTextsStartList:sTextsStartLists){

            int sTextLength = sTextsStartList.get(sTextsStartList.size()-1);
            for (int index = 0 ; index< sTextsStartList.size()-1;index++) {
                Integer i = sTextsStartList.get(index);
                styledText.setSpan(
                        new RelativeSizeSpan(size),
                        i,
                        i + sTextLength,
                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

            }
        }

        setText(styledText);
    }

}
